# 递归函数
# 1. 必须有一个明确的结束条件 - 递归出口
# 2. 每进更深一层的递归，问题规模比上次都有所减少
# 3. 相邻两次循环有紧密联系


def add(n):
    return 1 if n == 1 else n + add(n - 1)


print(add(100))

print("-------------------fibonacci----------------------------")


# 斐波那契数列: 1, 1, 2 , 3, 5, 8, 13, 21
def fibonacci(n):
    return 1 if n == 1 or n == 2 else fibonacci(n - 1) + fibonacci(n - 2)


print(fibonacci(10))

print("-------------------factorial----------------------------")


def factorial(n):
    return 1 if n == 1 else n * factorial(n - 1)


print(factorial(5))


print("-------------------闭包----------------------------")


# 在嵌套函数的前提下, 内部函数使用了外部函数 的变量, 而且外部函数返回了内部函数, 我们就把使用了外部函数变量的内部函数称为闭包
# 嵌套函数 + 使用外部函数变量 + 外部函数返回内部函数的函数名

def outer_fn():
    x = 10
    def inner_fn():
        print(x)
    return inner_fn

print(outer_fn()) # 返回内部函数的内存地址 <function outer_fn.<locals>.inner_fn at 0x00000181D7F4B3A0>
outer_fn()() # 调用内部函数, 输出 10


